home *** CD-ROM | disk | FTP | other *** search
Text File | 1987-08-06 | 4.7 KB | 207 lines | [TEXT/EDIT] |
- ( *** Function Key example. JL June 1987 *** )
-
- ONLY FORTH ALSO ASSEMBLER ALSO MAC
-
- 4ascii QD15 CONSTANT "qd15
- 4ascii bplt CONSTANT "bplt
- 4ascii DITL CONSTANT "ditl
- 4ascii DLOG CONSTANT "dlog
-
- 2 CONSTANT post.delay ( 2 ticks wait between posting of characters )
- 10 CONSTANT max.events ( max # of pending events allowed during posting )
-
- $14a CONSTANT EvQHdr
- $29A CONSTANT JGNEFilter
- 2 CONSTANT QHead
- 6 CONSTANT QTail
-
- BINARY 0000000000001000 CONSTANT KeyEvent
- DECIMAL
-
- ( header code filled at end of definitions )
- header start
- JMP start ( to be filled later )
- header temprect 8 allot
- header itemrect 8 allot
- header myEventRec 16 allot
-
- : beep 5 (call) sysbeep ;
-
- CODE cmove ( redefine since this is part of Kernel )
- MOVE.L (A6)+,D0
- MOVE.L (A6)+,A1
- MOVE.L (A6)+,A0
- TST.L D0
- BLE.S @2
- @1 MOVE.B (A0)+,(A1)+
- SUBQ.L #1,D0
- BNE.S @1
- @2 RTS
- END-CODE
-
- : / w/ ;
-
- : getFkeyDlg
- 2000 0 -1 (call) GetNewDialog
- ;
-
- : #events EvQHdr QTail + @ EvQHdr QHead + @ - 22 / ;
-
- : post.char ( char -- ) 3 swap (call) postEvent drop
- ;
-
- header SavedJGNEFilter 4 allot
- header SavedString 256 allot
- header bytesToTransfer 4 allot
- header lastpost 4 allot
-
- : GNEIntfc { | btt -- }
- getA1 w@ 0= IF
- ['] bytesToTransfer @ -> btt
- btt IF (call) tickcount ['] lastpost @ - post.delay >
- #events max.events < AND
- IF
- ['] SavedString dup c@ btt - 1+
- + c@ post.char
- btt 1- ['] bytesToTransfer !
- (call) tickcount ['] lastpost !
- THEN
- ELSE
- ['] savedJGNEFilter @ JGNEFilter !
- THEN
- THEN
- ;
-
- CODE GNE.glue
- LINK A6,#-256 ( 256 bytes of local Forth stack )
- MOVEM.L A0-A5/D0-D7,-(A7) ( save registers )
- ( no need for loop return stack )
- ( no parameters are passed )
- JSR GNEintfc ( call Forth routine )
-
- MOVEM.L (A7)+,A0-A5/D0-D7 ( restore registers )
- UNLK A6
- LEA SavedJGNEFilter,A0
- MOVE.L (A0),A0 ( return address )
- JMP (A0)
- END-CODE
-
- : post.string { string | length -- }
- string c@ -> length
- string ['] SavedString length 1+ cmove
- length ['] bytesToTransfer !
- (call) tickcount ['] lastpost !
- JGNEFilter @ ['] SavedJGNEFilter !
- ['] GNE.glue JGNEFilter !
- ;
-
- : post.message { msg# | dh dPtr tPtr -- }
- " FKEY.messages" (call) OpenResFile (call) UseResFile
- "bplt msg# 3 + (call) getResource -> dh
- dh IF dh @ post.string
- ELSE beep THEN
- ;
-
- : edit.messages { | dPtr itemType item box box1 itemHit thandle refnum -- }
- " FKEY.messages" dup (call) OpenResFile
- (call) ResError
- IF drop dup (call) CreateResFile
- (call) OpenResFile dup -> refNum
- (call) UseResFile
- ELSE dup -> refNum
- (call) UseResFile drop
- THEN
- getFkeyDlg -> dPtr
- dPtr IF
- 13 3 DO
- dPtr i ^ itemType ^ item ^ box
- (call) GetDItem
- item (call) HLock drop
- "bplt i (call) GetResource -> thandle
- thandle IF
- thandle (call) HLock drop
- item thandle @ (call) SetIText
- thandle (call) HUnlock drop
- ELSE
- 256 (call) NewHandle drop
- "bplt i " Message" (call) AddResource
- THEN
- item (call) HUnlock drop
- LOOP ( all messages have been initialized )
-
- 0 ^ itemHit (call) ModalDialog
-
- 13 3 DO
- dPtr i ^ itemType ^ item ^ box
- (call) GetDItem
- item (call) HLock drop
- "bplt i (call) GetResource -> thandle
- thandle IF
- thandle (call) HLock drop
- item thandle @ (call) GetIText
- thandle (call) ChangedResource
- thandle (call) HUnlock drop THEN
- item (call) HUnlock drop
- LOOP ( all messages have been updated )
- refNum (call) UpdateResFile
- dPtr (call) DisposDialog
- ELSE beep THEN
- ;
-
- : fkey { | keycode -- }
- (call) frontwindow windowkind + w@ l_ext dup
- 2 = swap 0< OR 0= IF
- BEGIN KeyEvent ['] myEventRec (call) GetNextEvent UNTIL
-
- ['] myEventRec message + @ $FF and -> keycode
- keycode ascii e =
- IF edit.messages
- ELSE
- keycode ascii 0 < keycode ascii 9 > OR
- IF beep ELSE keycode 48 - post.message
- THEN
- THEN
- ELSE beep
- THEN
- ;
-
- ( *** our standard glue routine *** )
-
- CODE fkey.glue
- LINK A6,#-2048 ( 2K bytes of local Forth stack )
- MOVEM.L A0-A5/D0-D7,-(A7) ( save registers )
- MOVE.L A6,A3 ( setup local loop return stack )
- SUBA.L #256,A3 ( starting 256 bytes below locals )
- ( no parameters are passed to the FKEY )
- JSR fkey ( call Forth routine )
-
- MOVEM.L (A7)+,A0-A5/D0-D7 ( restore registers )
- UNLK A6
- MOVE.L (A7)+,A0 ( return address )
- JMP (A0)
- END-CODE
-
- header end
-
- ( install initial jump vector )
- ' fkey.glue ' start 2+ - ' start 2+ w!
-
- ( *** installation *** )
-
- : make.fkey { | refNum namePtr -- }
- " fkey.text" dup $create-res
- abort" You have to delete the old 'fkey.text' file first."
- $open-res dup -> refNum call UseResFile
- ['] start ['] end over - call PtrToHand drop ( result code )
- "fkey 5 " Mach2 FKEY" call AddResource
- refNum $close-res drop ( result code )
- 0 " fkey.text"
- getvol ioVRefNum + w@ l_ext
- getfileinfo drop
- "qd15 "fkey " fkey.text" setfileinfo
- ;
-
-
-
-
-